package com.zbkj.common.enums;

import com.zbkj.common.exception.CommonException;
import lombok.Getter;

import java.math.BigDecimal;
import java.util.Objects;

/**
 * @Auther:
 * @Date: 2024/10/7 18:13
 * @Description:
 */
public enum ProjectParamGuoEnum {
    /**
     * 组：gtype说明 1、规模计数时机 2、应用类型
     *      3、分布式处理 4、性能 5、可靠性 6、多重站点 （质量特性）
     *      7、完整性级别 8、开发语言 9、开发团队背景
     */

    /**
     * gtyp:1、规模计数时机
     * type参数说明：
     * 101、估算早期  102 估算中期 103估算晚期 104 交付后及运维阶段
     */
    GUO_PARAM101(101,1, new BigDecimal("1.39")),
    GUO_PARAM102(102,1, new BigDecimal("1.21")),
    GUO_PARAM103(103,1, new BigDecimal("1.10")),
    GUO_PARAM104(104,1, new BigDecimal("1.00")),

    /**
     * gtyp:2、应用类型
     * type参数说明：
     * 201	业务处理:办公自动化系统;人事、会计、工资、销售等经营管理及业务处理用软件等
     * 202	应用集成:软件集成等
     * 203	科技:科学计算、模拟、统计分析等
     * 204	多媒体:图形、影像、声音等多媒体应用领域;地理信息系统;教育和娱乐等
     * 205	智能信息:自然语言处理、人工智能、专家系统等
     * 206	基础软件/支撑软件:操作系统、数据库系统、集成开发环境、自动化开发/设计工具等
     * 207	通信控制:通信协议、仿真、交换机软件、全球定位系统等
     * 208	流程控制:实时控制、机器人控制、嵌入式软件等
     */
    GUO_PARAM201(201,2, new BigDecimal("1")),
    GUO_PARAM202(202,2, new BigDecimal("1.2")),
    GUO_PARAM203(203,2, new BigDecimal("1.2")),
    GUO_PARAM204(204,2, new BigDecimal("1.3")),
    GUO_PARAM205(205,2, new BigDecimal("1.5")),
    GUO_PARAM206(206,2, new BigDecimal("1.7")),
    GUO_PARAM207(207,2, new BigDecimal("1.9")),
    GUO_PARAM208(208,2, new BigDecimal("2.0")),

    /**
     * gtyp:3、分布式处理
     * type参数说明：
     * 301	没有明示对分布式处理的需求事项
     * 302	通过网络进行客户端/服务器及网络基础计算机系统分布处理和传输
     * 303	在多个服务器及处理器上同时相互执行计算机系统中的处理功能
     */
    GUO_PARAM301(301,3, new BigDecimal("-1")),
    GUO_PARAM302(302,3, new BigDecimal("0")),
    GUO_PARAM303(303,3, new BigDecimal("1")),

    /**
     * gtyp:4、性能
     * type参数说明：
     * 401	没有明示对性能的特别需求事项或活动，因此提供基本性能
     * 402	应答时间或处理率对高峰时间或所有业务时间都很重要，对连动系统结束处理时间有限制
     * 403	为满足性能需求事项，要求设计阶段进行性能分析，或在设计、开发阶段使用分析工具
     */
    GUO_PARAM401(401,4, new BigDecimal("-1")),
    GUO_PARAM402(402,4, new BigDecimal("0")),
    GUO_PARAM403(403,4, new BigDecimal("1")),

    /**
     * gtyp:5、可靠性
     * type参数说明：
     * 501	没有明示对可靠性的特别需求事项或活动，因此提供基本的可靠性
     * 502	发生故障时可轻易修复，带来一定不便或经济损失
     * 503	发生故障时很难修复，发生重大经济损失或有生命危害
     */
    GUO_PARAM501(501,5, new BigDecimal("-1")),
    GUO_PARAM502(502,5, new BigDecimal("0")),
    GUO_PARAM503(503,5, new BigDecimal("1")),

    /**
     * gtyp:6、多重站点
     * type参数说明：
     * 601	在相同用途的硬件或软件环境下运行
     * 602	在用途类似的硬件或软件环境下运行
     * 603	在不同用途的硬件或软件环境下运行
     */
    GUO_PARAM601(601,6, new BigDecimal("-1")),
    GUO_PARAM602(602,6, new BigDecimal("0")),
    GUO_PARAM603(603,6, new BigDecimal("1")),

    /**
     * gtyp:7、完整性级别
     * type参数说明：
     * 701	没有明确的完整性级别或等级为C/D
     * 702	完整性级别为A/B同时为达成完整性级别要求采取了特殊的设计及实现方式
     * 703	完整性级别为A同时为达成完整性级别要求在软件开发全生命周期均采取了特定、明确的措施
     */
    GUO_PARAM701(701,7, new BigDecimal("1")),
    GUO_PARAM702(702,7, new BigDecimal("1.1")),
    GUO_PARAM703(703,7, new BigDecimal("1.3")),

    /**
     * gtyp:8、完整性级别
     * type参数说明：
     * 801	C及其他同级别语言/平台
     * 802	JAVA、C++、C#及其他同级别语言/平台
     * 803	PowerBuilder、ASP及其他同级别语言/平台
     */
    GUO_PARAM801(801,8, new BigDecimal("1.5")),
    GUO_PARAM802(802,8, new BigDecimal("1")),
    GUO_PARAM803(803,8, new BigDecimal("0.6")),

    /**
     * gtyp:9、完整性级别
     * type参数说明：
     * 901	为本行业开发过类似的项目
     * 902	为其他行业开发过类似的项目，或为本行业开发过不同但相关的项目
     * 903	没有同类项目的背景
     */
    GUO_PARAM901(901,9, new BigDecimal("0.8")),
    GUO_PARAM902(902,9, new BigDecimal("1")),
    GUO_PARAM903(903,9, new BigDecimal("1.2")),
    ;


    @Getter
    private int item; //国标参数-选项类型值
    @Getter
    private int gtype;  //国标参数组类型
    @Getter
    private BigDecimal val; //国标参数选项对应值

    ProjectParamGuoEnum(int item, int gtype, BigDecimal val) {
        this.item = item;
        this.gtype = gtype;
        this.val = val;
    }

    public static BigDecimal findVal(Integer item, Integer groupType) {
        if(Objects.isNull(item)) {
            return null;
        }
        for (ProjectParamGuoEnum gouenum : ProjectParamGuoEnum.values()) {
            if(Objects.isNull(groupType) && gouenum.getItem() == item) {
                return gouenum.getVal();
            }
            if(Objects.nonNull(groupType) && gouenum.gtype == groupType && gouenum.getItem() == item) {
                return gouenum.getVal();
            }
        }
        return null;
    }

    public static BigDecimal findValAndCheck(Integer item, Integer groupType) {
        BigDecimal val = findVal(item,groupType);
        if(Objects.isNull(val)) {
            throw new CommonException("参数选项值错误");
        }
        return val;
    }
}
